import Snake from './Snake';
import Food from './Food';
import ScorePanel from './ScorePanel';


// 游戏控制器，控制其他所有的类
class GameControl {
  // 定义三个属性
  snake: Snake;
  food: Food;
  scorePanel: ScorePanel;

  // 创建一个属性来存储蛇的移动方向（也就是键盘的方向）
  direction: string = '';

  // 创建一个属性用来记录游戏是否还进行
  islive: boolean = true;

  constructor() {
    this.snake = new Snake();
    this.food = new Food();
    this.scorePanel = new ScorePanel();
    this.init();
  }

  init() {
    // 绑定键盘按下事件
    // 改变this的指向
    document.addEventListener('keydown', this.keydownHandler.bind(this))
    // 调用蛇移动的方法
    this.run();
 
  }
  /**
   * @description 创建一个键盘按下的响应函数
   * @param { keyboardEvent} event 键盘按下携带参数
   * event.key: ArrowUp、ArrowDown、ArrowLeft、ArrowRight
   */
  keydownHandler(event: KeyboardEvent) {
    console.log(event.key);
    //修改direction的值
    this.direction = event.key;
  }

  // 创建蛇移动的方向
  run() {
    // 根据方向来使得蛇的位置放生改变
    let X = this.snake.X;
    
    let Y = this.snake.Y;

    // 根据按键方向修改X Y值
    switch (this.direction) {
      case 'ArrowUp':
      case 'Up':
        Y -= 10;
        break;
      case 'ArrowDown':
      case 'Down':
        Y += 10;
        break;
      case 'ArrowLeft':
      case 'Left':
        X -= 10;
        break;
      case 'ArrowRight':
      case 'Right':
        X += 10;
        break;
    }

    // 检测蛇是否吃到了食物
    this.checkEat(X, Y)
    
     // 修改蛇的X和Y值
    try {
      this.snake.X = X;
      this.snake.Y = Y;
    } catch(err: any) {
      // 捕获异常后程序并不会停止运行，
      alert(err.message);
      this.islive = false;
    }

    // 开启一个定时调用
    this.islive && setTimeout(this.run.bind(this) , 300 -(this.scorePanel.level -1) * 30)
  }

  // 检查蛇是否吃到了食物
  checkEat(X: number, Y: number) {
    if (X === this.food.X && Y === this.food.Y) {
      // 食物改变位置
      this.food.change()
      // 分数增加
      this.scorePanel.addScore()
      // 蛇增加身体
      this.snake.addBody()
    }
  }
}
export default GameControl;